﻿#include "array_fifo.h"
#include <stdlib.h>
#include <stdio.h>
#include<string.h>
typedef  struct _fifo_array 
{
	element *arr;
	int rear;
	int head;  
	int n;
}fifo_array;

static fifo_array fifo[N];
static int num;
error	create_array_fifo(int n)
{
	if(n < 1) return param_error;
	if(num < N)//判断当前已创建的队列数量 num 是否小于允许创建的最大队列数量 N
	{
		fifo[num].arr = (element *)malloc(sizeof(element) * (n + 1));//为队列元素数组分配内存空间
		if(fifo[num].arr == nullptr)
			return malloc_error;
		fifo[num].n = n + 1;
		fifo[num].head = 0;
		//初始化队列的头指针 fifo[num].head 为 0，尾指针 fifo[num].rear 为 1
		fifo[num].rear = 1;
		++num;
		//将已创建的队列数量 num 加 1
		return OK;
	}
	else
		return 队列数量已用完;
}
int  isEmpty(int num)
{
	if(num >= N || num < 0) return -1;
	if(fifo[num].arr==nullptr) return -2;
	if(fifo[num].rear == 0 && fifo[num].head == fifo[num].n-1)
		return 1;
	else
		return fifo[num].rear == fifo[num].head + 1 ? 1 : 0;
}
int isFull(int num)
{
	if(num >= N || num < 0) return -1;
	if(fifo[num].arr == nullptr) return -2;
	return fifo[num].rear == fifo[num].head  ? 1 : 0;
}
error in_array_fifo(int num, element *a)
{
	if(num >= N || num < 0) return param_error;
	if(fifo[num].arr == nullptr) return param_error;
	if(isFull(num))
	{
		printf("队列%d已满",num);
		return full;
	}
	memcpy(fifo[num].arr+fifo[num].rear,a,sizeof(element));
	++fifo[num].rear;
	fifo[num].rear == fifo[num].n ? fifo[num].rear = 0 : 1;
	//fifo[num].rear%=fifo[num].n;
	return OK;
}
error out_array_fifo(int num, element *a)
{
	if(num >= N || num < 0) return param_error;
	if(fifo[num].arr == nullptr) return param_error;
	if(isEmpty(num))
	{
		printf("队列%已空", num);
		return empty;
	}
	++fifo[num].head;
	fifo[num].head %= fifo[num].n;
	memcpy(a, fifo[num].arr + fifo[num].head, sizeof(element));
	return OK;
}
error free_array_fifo(int num)
{
	if(num >= N || num < 0) return param_error;
	if(fifo[num].arr == nullptr) return param_error;
	if(isEmpty(num))
	{
		free(fifo[num].arr);
		fifo[num].arr = nullptr;
		printf("队列%已经释放\n", num);
		return OK;
	}
	else
	{
		printf("队列%d不空，不能释放\n", num);
		return not_empty;
	}
}
//至此，FIFO基本操作已经设计完成，但是还可以补充求队列元素个数函数